#ifndef ARBREAVLADAPTATEUR_H_
#define ARBREAVLADAPTATEUR_H_

#include "ArbreAVL.h"
#include "EnsembleCouples.h"

namespace tp3
{

	/*
	 * \class ListAdaptateur
	 * \brief Classe permettant de faire le lien entre la classe Memoizer et notre arbreAVL
	 * \fn ListAdaptateur<TypeCle, TypeValeur>
	 */
	template<typename TypeCle, typename TypeValeur>
	class ArbreAVLAdaptateur
	{
	public:
		/*
		 * \brief Constructeur de la Classe ArbreAVLAdaptateur
		 * \param unsigned int taille_maximale
		 * \fn ArbreAVLAdaptateur(unsigned int taille_maximale)
		 */
		ArbreAVLAdaptateur(unsigned int taille_maximale);
		/*
		 * \brief Méthode permettant d'afficher le contenue dont la clé est la même
		 * \param const TypeCle& cle
		 * \fn TypeValeur lire(const TypeCle& cle) const
		 * \return la valeur de l'element TypeValeur
		 */
		TypeValeur lire(const TypeCle& cle) const;
		/*
		 * \brief Méthode permettant de savoir si la table n'est pas vide
		 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
		 * \return true ou false
		 */
		bool nEstPasPlein() const;
		/*
		 * \brief Méthode permettant d'ajouter un élément
		 * \param const TypeCle& cle
		 * \param const TypeValeur& valeur
		 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
		 * \post throw ErreurDictionnairePlein = si la clé n'existe pas
		 */
		void ajouter(const TypeCle& cle, const TypeValeur& valeur);
		/*
		 * \brief Méthode permettant de lister tout les éléments
		 * \fn ArbreAVLAdaptateur<TypeCle, TypeValeur>::listerElements() const
		 * \return EnsembleCouples<TypeCle, TypeValeur>
		 */
		EnsembleCouples<TypeCle, TypeValeur> listerElements() const;

	private:
		ArbreAVL<TypeCle, TypeValeur> m_arbre;
		unsigned int m_taille_maximale;
	};

}

#include "ArbreAVLAdaptateur.inl"

#endif /* ARBREAVLADAPTATEUR_H_ */
